package com.vy.stl.controller;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.github.pagehelper.PageInfo;
import com.vy.stl.constants.Constants;
import com.vy.stl.entity.Course;
import com.vy.stl.service.CourseService;
import com.vy.stl.util.Result;
import com.vy.stl.vo.CourseVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * @create: 2025/08/30 14:56
 * @description:课程相关控制器
 */
/*
1. 接收前端请求与参数绑定
    前端通过GET /course请求访问后端时，会携带查询参数
    "参数绑定机制"：Spring MVC 通过请求参数名与方法参数名的匹配，自动将前端参数绑定到getAll方法的参数中，实体对象通过属性名匹配，自动接收前端传递的参数
2. 调用Service层获取业务数据
    Controller层通过依赖注入（@Autowired）持有CourseService实例，将参数传递给Service层方法，获取实际的课程数据
3. 封装统一响应对象（Result）
    获取数据后，Controller层将状态码和业务数据封装到自定义的Result对象中（统一响应格式）
    统一响应格式的作用：规范前后端交互协议，让前端能通过固定结构（如{code: 200, data: [...]}）解析数据，降低对接成本。
4. Spring MVC自动序列化JSON并返回
    @RestController注解，Spring MVC会自动执行：
        ①JSON序列化：通过内置的消息转换器（如MappingJackson2HttpMessageConverter），将Result对象（包含CourseVo列表或PageInfo）序列化为JSON字符串；
        ②写入响应体：将JSON字符串写入HTTP响应的Body中，并设置响应头Content-Type: application/json，告知前端这是JSON格式数据
5. 前端接收与解析数据
    前端通过 HTTP 请求（如 Axios）接收响应后：
    从响应体中读取JSON字符串，解析为JavaScript对象
    通过data字段获取实际业务数据并渲染到页面表格中
*/
@RestController
@RequestMapping("/course")
@Slf4j

public class CourseController {

    @Autowired
    private CourseService courseService;

    @GetMapping
    /*String name, Integer coachId要与前端的pageInfo.name, pageInfo.coachId相匹配，或者直接Course course */
    public Result getAll(Integer page, Integer limit, Course course) {
        if (ObjectUtils.isEmpty(page) && ObjectUtils.isEmpty(limit)) {
            List<CourseVO> courseList = courseService.search(course);
            return Result.success(Constants.STATUS_200,courseList);
        }
        // 分页查询
        PageInfo pageInfo = courseService.searchByPage(page,limit,course);
        return Result.success(Constants.STATUS_200,pageInfo);
    }

    @PostMapping
    public Result add(@RequestBody Course course) {

//        创建课程时，经常忘记添加时间，希望对此进行异常提醒

        /*
        前后端接口联调测试：对后端接口的请求数据接收能力进行验证
        前端通过发起HTTP PUT请求，将课程数据以请求体（Request Body）的形式传递至后端；后端借助Spring Boot的@PutMapping(映射HTTP PUT请求)与@RequestBody(解析请求体为Java对象)注解，尝试将请求体数据绑定到Course实体类对象中。通过后端打印course对象的操作，验证服务端是否能正确接收并解析客户端（前端）传递的请求数据，确保前后端在数据交互格式与接口契约上的一致性，属于接口功能测试中“请求数据传输与服务端接收逻辑验证”的环节
        */
        /*System.out.println("course = " + course);
        return null;*/
        try {
            courseService.add(course);
            return Result.success(Constants.STATUS_200);
        } catch (Exception e) {
            return Result.error(Constants.ADD_COURSE_ERROR,e.getMessage());
        }
    }

    @PutMapping
    public Result modify(@RequestBody Course course) {
        try {
            courseService.edit(course);
            return Result.success(Constants.STATUS_200);
        } catch (Exception e) {
            return Result.error(Constants.EDIT_COURSE_ERROR,e.getMessage());
        }
    }

    @DeleteMapping("{id}")
    public Result remove(@PathVariable("id") Integer id) {
        /*System.out.println("id = " + id);
        return null;*/
        try {
            courseService.remove(id);
            return Result.success(Constants.STATUS_200);
        } catch (Exception e) {
            return Result.error(Constants.REMOVE_COURSE_ERROR,e.getMessage());
        }
    }

/*    public static void main(String[] args) {
        Date nowDate = new Date();
        DateTime dateTime = DateUtil.offsetDay(nowDate, -1);
        System.out.println("dateTime = " + dateTime);
        DateTime dateTime1 = DateUtil.offsetMinute(nowDate, -60);
        System.out.println("dateTime1 = " + dateTime1);
        Date jdkDate = dateTime1.toJdkDate();
        System.out.println("jdkDate = " + jdkDate);
        当前时间：2025-09-01 15:14:29
        dateTime = 2025-08-31 15:14:29
        dateTime1 = 2025-09-01 14:14:29
        jdkDate = Mon Sep 01 14:14:29 CST 2025
    }*/
}
